package innerclass;

public class StaticInnerClass {

    public static void main(String[] args) {

        //调用外部类对象的方法
        StaticOuter outer = new StaticOuter();
        outer.outerFunction();

        //通过 new 外部类名.静态内部类名() 创建静态内部类对象，需要满足访问权限（无法访问private）
        StaticOuter.Inner inner1 = new StaticOuter.Inner();
        inner1.innerFunction();

        //通过外部类中的方法返回静态内部类的实例对象（可以将方法修饰为static，用类名.方法名的方式直接返回静态内部类的对象，即调用类方法，不用创建外部类实例）
        StaticOuter.Inner inner2 = outer.getInner();
        inner2.innerFunction();

    }

}

//外部类
class StaticOuter{

    private int num = 10;

    private static int staticNum = 20;

    //静态内部类
    static class Inner{

        public void innerFunction(){
            //访问外部类的非静态成员时会报错
            //System.out.println("num:" + num);
            System.out.println("staticNum: " + staticNum);
        }

    }

    //通过外部类的方法，创建静态内部类对象并访问方法
    public void outerFunction(){
        Inner inner = new Inner();
        inner.innerFunction();
    }

    public Inner getInner(){
        return new Inner();
    }

}